package demo3;


//      接口
//      1.使用interface来修饰的。 interface IA{}
//      2.接口当中普通的方法 不能有具体的实现 如果非要实现只能通过关键字default修饰这个方法
//      3.接口当中可以使用静态方法
//      4.接口IShape中 发现public是灰色的（可以不加）  里面的默认方法自带public
//      5.抽象方法 默认是public abstract
//      6.接口是不可以通过关键字new来实例化的
//      7.类和接口之间的关系是通过implements实现的
//      8.当一个类实现了一个接口 就必须要重写接口当中的抽象方法
//      9.接口当中的成员变量 默认是public static final修饰的 在demo3的text2里
//      10.当一个类实现一个接口之后 重写这个方法的时候 这个方法前面必须加上public
//      11.一个类可以通过关键字extends继承一个抽象或者普通类 但是只能继承一个类 同时也可以通过
//      implements实现多个接口  接口之间使用逗号隔开  在text2
//      12.接口和接口之间 存在什么关系？在text3
//      接口和接口之间 可以使用extends来操作他们的关系 此时的extends字面意思为 拓展
//      一个接口通过extends来拓展另一个接口的功能 当一个类(C1)通过implements实现这个接口(IB1)
//      的时候 此时重写的方法不仅是IB1的抽象方法 还有它从IA1拓展来的功能(方法)
interface IShape {
//      5.
//    void draw();等于下面那行代码
    public abstract void draw();//抽象方法

//    public void func(){
//        System.out.println("asdfasfdf");
//    } //报错
//      2.
    default public void func(){
        System.out.println("asdfasfdf");
    }
//      3.
    public static void funcStatic(){
        System.out.println("静态方法");
    }
}
class Rect implements IShape {
    @Override
    public void draw() {
        System.out.println("♦");
    }
}
class Flower implements IShape{
    @Override
    public void draw() {
        System.out.println("❀");
    }

//    @Override
//    public void func() {
//        System.out.println("重写接口当中的默认方法");
//        IShape.super.func();
//    }
}
public class Test {

    public static void main1(String[] args) {
//        6.
//        IShape iShape = new IShape(); error


        IShape iShape = new Flower();//接口引用可以引用具体的对象
        iShape.draw();
    }

//      也可以发生动态绑定
    public static void drawMap(IShape iShape){
        iShape.draw();
    }
    public static void main(String[] args) {
        Rect rect = new Rect();
        drawMap(rect);
        drawMap(new Flower());
    }

}
